package com.wontube.core.utils;

import javax.servlet.jsp.PageContext;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * author: yuechao Date: 2011-10-13 Time: 8:58:12
 * 
 * StringResource用于管理字符串资源
 */
public final class StringResource {
	private static Map<String, String> cache = new HashMap<String, String>();
	public static final boolean CACHE_ENABLED = false;

	/**
	 * 读取整个文件的文本内容作为一个字符串
	 * 
	 * @param filePath
	 *            文件路径
	 * @param lineBreak
	 *            是否在每行之间添加换行符
	 */
	public static String FromFile(String filePath, boolean lineBreak)
			throws IOException {
		// 1, 尝试从cache中获取
		String s = cache.get(filePath.toUpperCase());
		if (s != null) {
			return s;
		}

		// 2, 读取文件
		StringBuffer buf = new StringBuffer();
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(filePath));

			do {
				String line = reader.readLine();
				if (line == null) {
					break;
				}

				if (lineBreak && (buf.length() > 0)) {
					buf.append("\r\n");
				}
				buf.append(line);
			} while (true);
		} finally {
			if (reader != null) {
				reader.close();
			}
		}

		// 3，加入缓存中
		s = buf.toString();
		buf.setLength(0);
		cache.put(filePath, s);

		return s;
	}

	/**
	 * 根据PageContext和web相对路径获取字符串资源
	 * 
	 * @param ctx
	 * @param relativePath
	 * @param tag
	 * @throws IOException
	 */
	public static String fromFile(PageContext ctx, String relativePath,
			String tag) throws IOException {
		String root = ctx.getServletContext().getRealPath("/");
		if (!root.endsWith(File.separator)) {
			root += File.separator;
		}
		return fromFile(root, relativePath, tag);
	}

	/**
	 * 根据PageContext和web相对路径获取字符串资源
	 * 
	 * @param rootPath
	 * @param relativeFilePath
	 * @param tag
	 * @throws IOException
	 */
	public static String fromFile(String rootPath, String relativeFilePath,
			String tag) throws IOException {
		return fromFile(rootPath + relativeFilePath, tag);
	}

	/**
	 * 从指定文件中读取以指定tag标记的一段字符串, 不换行并去空格
	 * 
	 * @param filePath
	 *            文件路径
	 * @param tag
	 *            用大于号和小于号括起来的标识字符串的tag(不包含大于号和小于号)， 如对于tag"<MyTag>"，参数为"MyTag"
	 */
	public static String fromFile(String filePath, String tag)
			throws IOException {
		return fromFile(filePath, tag, false, true);
	}

	/**
	 * 从指定文件中读取以指定tag标记的一段字符串
	 * 
	 * @param filePath
	 *            文件路径
	 * @param tag
	 *            用大于号和小于号括起来的标识字符串的tag(不包含大于号和小于号)， 如对于tag"<MyTag>"，参数为"MyTag"
	 * @param lineBreak
	 *            是否需要在每行字符串之间加入换行符
	 */
	public static String fromFile(String filePath, String tag,
			boolean lineBreak, boolean trim) throws IOException {
		// 获取字符串资源标识
		String key = genKey(filePath, tag);

		String s;
		if (CACHE_ENABLED) {
			s = cache.get(key);
			if (s != null) {
				return s;
			}
		}

		// 尝试从文件中读取
		BufferedReader reader = null;
		StringBuffer buf = new StringBuffer();

		try {
			reader = new BufferedReader(new FileReader(filePath));

			boolean found = false, firstLine = false;

			String startTag = GenStartTag(tag), endTag = GenEndTag(tag);

			do {
				String line = reader.readLine();
				if (line == null) {
					break;
				}

				int i = line.indexOf(startTag);
				if (i >= 0) {
					found = true;
					firstLine = true;
					int j = line.indexOf(endTag, i + startTag.length());
					if (j > 0) {
						// 只有一行
						append(buf, line.substring(i + startTag.length(), j),
								trim);
						break;
					}
				}

				if (found) {
					int j = line.indexOf(endTag);
					if (j >= 0) {
						// 找到结束符
						if (!line.startsWith(endTag)) {
							// 添加最后一行
							if (lineBreak && (buf.length() > 0)) {
								buf.append("\r\n");
							}
							append(buf, line.substring(0, j), trim);
						}
						break;
					} else {
						if (firstLine) {
							// 处理第一行
							if (!line.endsWith(startTag)) {
								append(buf,
										line.substring(i + startTag.length()),
										trim);
							}
							firstLine = false;
						} else {
							// 中间的行
							if (lineBreak && (buf.length() > 0)) {
								buf.append("\r\n");
							}
							append(buf, line, trim);
						}
					}
				}
			} while (true);
		} finally {
			if (reader != null) {
				reader.close();
			}
		}

		s = buf.toString();
		buf.setLength(0);

		// 4，加入缓存中
		if (CACHE_ENABLED) {
			cache.put(key, s);
		}

		return s;
	}

	private static void append(StringBuffer buf, String s, boolean trim) {
		if (trim) {
			s = s.trim();
		}
		buf.append(s);
	}

	private static String genKey(String filePath, String tag) {
		return filePath.toUpperCase() + '.' + tag;
	}

	private static String GenStartTag(String tag) {
		return '<' + tag + '>';
	}

	private static String GenEndTag(String tag) {
		return "</" + tag + '>';
	}
}
